#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
简化版RAG API - 用于测试和演示

功能：
1. 接收前端上传的简历文件
2. 模拟RAG流程
3. 返回模拟的岗位推荐结果

作者：AI助手
日期：2024
"""

import os
import json
import tempfile
from typing import Dict, Any
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from django.views import View
from django.utils.decorators import method_decorator
import logging

logger = logging.getLogger(__name__)

class SimpleRAGAPIView(View):
    """简化版RAG API视图"""
    
    ALLOWED_EXTENSIONS = {'.pdf', '.doc', '.docx', '.txt'}
    MAX_FILE_SIZE = 10 * 1024 * 1024  # 10MB

    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def post(self, request):
        """处理简历文件上传并返回模拟推荐结果"""
        try:
            # 检查文件上传
            if 'resume_file' not in request.FILES:
                return JsonResponse({
                    'success': False,
                    'message': '请选择要上传的简历文件',
                    'error': 'NO_FILE_UPLOADED'
                }, status=400)
            
            resume_file = request.FILES['resume_file']
            top_n = int(request.POST.get('top_n', 10))
            
            # 基本验证
            if resume_file.size == 0:
                return JsonResponse({
                    'success': False,
                    'message': '文件为空'
                }, status=400)
            
            # 模拟RAG推荐结果
            mock_result = self._generate_mock_recommendations(resume_file.name, top_n)
            
            return JsonResponse({
                'success': True,
                'message': f'RAG推荐成功，共推荐{len(mock_result["job_recommendations"])}个岗位',
                'data': mock_result
            })
            
        except Exception as e:
            logger.error(f"RAG API处理异常: {str(e)}")
            return JsonResponse({
                'success': False,
                'message': '服务器内部错误',
                'error': 'INTERNAL_SERVER_ERROR'
            }, status=500)

    def _generate_mock_recommendations(self, filename: str, top_n: int) -> Dict[str, Any]:
        """生成模拟的推荐结果"""
        
        # 模拟岗位数据
        mock_jobs = [
            {
                'job_id': 1,
                'title': 'Python后端开发工程师',
                'company': '阿里巴巴',
                'location': '北京',
                'salary': '25000-35000',
                'description': '负责电商平台后端开发，要求熟悉Python、Django、MySQL等技术栈',
                'match_score': 0.92,
                'match_reason': '技能匹配度高：Python、Django、MySQL经验丰富，电商背景匹配',
                'source': 'Milvus'
            },
            {
                'job_id': 2,
                'title': '全栈开发工程师',
                'company': '腾讯',
                'location': '北京',
                'salary': '30000-45000',
                'description': '负责产品全栈开发，需要前后端技术栈和大数据处理经验',
                'match_score': 0.89,
                'match_reason': '全栈技能匹配：React+Django+大数据经验符合要求',
                'source': 'Mixed'
            },
            {
                'job_id': 3,
                'title': '大数据开发工程师',
                'company': '字节跳动',
                'location': '北京',
                'salary': '28000-40000',
                'description': '负责大数据平台开发，要求熟悉Spark、Kafka、Hadoop等技术',
                'match_score': 0.85,
                'match_reason': 'Spark、Kafka、大数据项目经验完全匹配岗位需求',
                'source': 'ES'
            },
            {
                'job_id': 4,
                'title': '架构师',
                'company': '美团',
                'location': '北京',
                'salary': '35000-50000',
                'description': '负责系统架构设计，要求有大型项目经验和团队管理能力',
                'match_score': 0.82,
                'match_reason': '5年经验+架构设计+团队管理经验匹配高级岗位',
                'source': 'Milvus'
            },
            {
                'job_id': 5,
                'title': 'DevOps工程师',
                'company': '百度',
                'location': '北京',
                'salary': '22000-32000',
                'description': '负责CI/CD和容器化部署，要求熟悉Docker、Kubernetes、Jenkins',
                'match_score': 0.78,
                'match_reason': 'Docker、Kubernetes、Jenkins技能匹配DevOps需求',
                'source': 'ES'
            }
        ]
        
        # 只返回请求的数量
        selected_jobs = mock_jobs[:min(top_n, len(mock_jobs))]
        
        # 构建响应数据
        result = {
            'resume_info': {
                'file_name': filename,
                'skills': ['Python', 'Django', 'React', 'MySQL', 'Redis', 'Spark', 'Docker', 'Kubernetes'],
                'experience_years': 5,
                'education': '本科',
                'location': '北京',
                'parsing_time': 2.5
            },
            'job_recommendations': selected_jobs,
            'recommendation_summary': {
                'total_recommendations': len(selected_jobs),
                'avg_match_score': round(sum(job['match_score'] for job in selected_jobs) / len(selected_jobs), 3),
                'top_skills_matched': ['Python', 'Django', 'React', '大数据', 'Docker'],
                'search_methods_used': ['ES关键词检索', 'Milvus语义检索', '混合结果融合'],
                'es_results_count': 8,
                'milvus_results_count': 12
            }
        }
        
        return result

    def get(self, request):
        """GET请求返回API说明"""
        return JsonResponse({
            'api_name': '简化版RAG岗位推荐API',
            'version': '2.0-mock',
            'description': '接收简历文件，返回模拟的岗位推荐结果（用于测试）',
            'status': 'running',
            'methods': ['POST'],
            'supported_formats': list(self.ALLOWED_EXTENSIONS),
            'max_file_size': f'{self.MAX_FILE_SIZE // (1024*1024)}MB',
            'features': [
                '文件上传处理',
                '模拟RAG推荐',
                '岗位匹配分析',
                '推荐理由生成'
            ],
            'usage': {
                'url': '/api/resume/simple-recommend/',
                'method': 'POST',
                'form_fields': {
                    'resume_file': '简历文件 (必需)',
                    'top_n': '推荐岗位数量 (可选，默认10)'
                },
                'example_curl': 'curl -X POST -F "resume_file=@resume.pdf" -F "top_n=5" http://localhost:8000/api/resume/simple-recommend/'
            }
        })


# 函数式视图版本
@csrf_exempt
@require_http_methods(["POST", "GET"])
def simple_rag_recommend(request):
    """函数式视图版本的简化RAG推荐"""
    view = SimpleRAGAPIView()
    if request.method == 'GET':
        return view.get(request)
    else:
        return view.post(request)
